import os
from pathlib import Path
from django.core.management.base import BaseCommand
from django.utils.text import slugify
from core.models import Category

class Command(BaseCommand):
    help = '从docs/books/ops目录自动导入分类结构'

    # 中英文映射关系
    CATEGORY_MAP = {
        # 一级分类
        '基础设施': 'infrastructure',
        '中间件': 'middleware',
        '云原生技术': 'cloud-native',
        '运维管理': 'ops-management',
        '安全运维': 'security',
        '项目管理': 'project',
        
        # 基础设施
        'Linux系统管理': 'linux',
        '网络服务与安全': 'network',
        '存储系统': 'storage',
        '虚拟化技术': 'virtualization',
        
        # 中间件
        'Web服务器': 'web-server',
        '数据库': 'database',
        '消息队列': 'mq',
        '搜索引擎': 'search',
        'HAProxy': 'haproxy',
        'RabbitMQ': 'rabbitmq',
        
        # 云原生技术
        '容器技术': 'container',
        '基础概念': 'basic',
        '运行时管理': 'runtime',
        '镜像管理': 'image',
        '存储管理': 'storage',
        'Kubernetes': 'k8s',
        '集群部署': 'cluster',
        '核心概念': 'concepts',
        '资源管理': 'resources',
        '配置管理': 'config',
        '网络方案': 'network',
        '存储方案': 'storage-solution',
        '安全配置': 'security',
        '运维管理': 'maintenance',
        '高级特性': 'advanced',
        '服务网格': 'service-mesh',
        'Istio': 'istio',
        '可观测性': 'observability',
        '微服务架构': 'microservice',
        '服务治理': 'governance',
        '云原生存储': 'cloud-storage',
        'Ceph': 'ceph',
        'Rook': 'rook',
        'OpenEBS': 'openebs',
        '云原生网络': 'cloud-network',
        '网络模型': 'network-model',
        '网络组件': 'network-components',
        '网络策略': 'network-policy',
        '云原生安全': 'cloud-security',
        '基础设施安全': 'infra-security',
        '应用安全': 'app-security',
        '安全运维': 'security-ops',
        '云原生应用': 'cloud-apps',
        '应用编排': 'orchestration',
        '应用管理': 'app-management',
        'DevOps实践': 'devops',
        '持续集成': 'ci',
        '持续部署': 'cd',
        '自动化测试': 'testing',
        '网络管理': 'network-management',
        '安全管理': 'security-management',
        '核心架构': 'core-architecture',
        '流量管理': 'traffic-management',
        '监控系统': 'monitoring-system',
        '系统集成': 'system-integration',
        '链路追踪': 'tracing',
        '告警系统': 'alerting',
        '运维工具': 'ops-tools',
        
        # 运维管理
        '监控告警': 'monitoring',
        'Prometheus': 'prometheus',
        'ELK平台': 'elk',
        '基础架构': 'architecture',
        '部署配置': 'deployment',
        '数据采集': 'collection',
        '查询分析': 'analysis',
        '监控系统集成': 'monitoring-integration',
        '日志管理': 'logging',
        '日志规范': 'log-spec',
        '配置管理': 'configuration',
        '自动化运维': 'automation',
        'Ansible': 'ansible',
        'Jenkins': 'jenkins',
        'CICD': 'cicd',
        '网络代理': 'proxy',
        'OpenVPN': 'openvpn',
        'Shadowsocks': 'shadowsocks',
        'V2Ray': 'v2ray',
        '容器运维': 'container-ops',
        '备份恢复': 'backup',
        'Docker专题': 'docker',
        
        # 安全运维
        '系统安全': 'system-security',
        '网络安全': 'network-security',
        '应用安全': 'application-security',
    }

    def handle(self, *args, **options):
        # 获取项目根目录
        project_root = Path(__file__).resolve().parent.parent.parent.parent.parent
        base_path = os.path.join(project_root, 'docs', 'books', 'ops')
        
        self.stdout.write('开始导入分类结构...')
        self.stdout.write(f'导入路径: {base_path}')
        
        # 清理现有分类
        if self.confirm_delete():
            Category.objects.all().delete()
            self.stdout.write('已清理现有分类数据')
        
        # 创建根分类
        root = Category.objects.create(
            title='运维知识库',
            slug='ops',
            is_nav=True,
            nav_path='/',
            nav_sort=0,
            order_index=0
        )
        self.stdout.write(f'创建根分类: {root.title}')
        
        # 递归导入目录结构
        self.import_directory(base_path, root)
        
        self.stdout.write(self.style.SUCCESS('分类结构导入完成！'))
    
    def confirm_delete(self):
        """确认是否删除现有数据"""
        confirm = input('是否清理现有分类数据？(y/n): ')
        return confirm.lower() == 'y'
    
    def import_directory(self, path, parent, level=0):
        """递归导入目录结构"""
        try:
            # 读取目录下的README.md获取描述信息
            readme_path = os.path.join(path, 'README.md')
            description = ''
            if os.path.exists(readme_path):
                with open(readme_path, 'r', encoding='utf-8') as f:
                    description = f.read()
            
            # 遍历目录
            items = sorted(os.listdir(path))
            for index, item in enumerate(items):
                if item.startswith('.') or item == 'README.md':
                    continue
                    
                full_path = os.path.join(path, item)
                if os.path.isdir(full_path):
                    # 处理目录名称
                    name = self.parse_directory_name(item)
                    if not name:
                        continue
                    
                    # 生成英文slug
                    base_slug = self.CATEGORY_MAP.get(name)
                    if not base_slug:
                        # 如果找不到映射，尝试使用目录名生成
                        base_slug = slugify(name)
                        if not base_slug:
                            self.stdout.write(self.style.WARNING(f'无法为 {name} 生成有效的slug'))
                            continue
                    
                    # 构建完整的slug路径
                    if parent.id != 1:  # 非一级分类，使用父级slug作为前缀
                        base_slug = f"{parent.slug}-{base_slug}"
                    else:
                        base_slug = f"ops-{base_slug}"
                    
                    # 检查slug是否已存在，如果存在则添加计数后缀
                    original_slug = base_slug
                    counter = 1
                    while Category.objects.filter(slug=base_slug).exists():
                        base_slug = f"{original_slug}-{counter}"
                        counter += 1
                    
                    try:
                        # 创建分类
                        category = Category.objects.create(
                            title=name,
                            slug=base_slug,
                            description=description,
                            parent=parent,
                            is_nav=True if parent.id == 1 else False,  # 只有一级分类显示在导航
                            nav_path=f'/{base_slug}',
                            nav_sort=index + 1,
                            order_index=index + 1
                        )
                        self.stdout.write(f'{"  " * level}创建分类: {category.title} (slug: {category.slug})')
                        
                        # 递归处理子目录
                        self.import_directory(full_path, category, level + 1)
                    except Exception as e:
                        self.stdout.write(self.style.ERROR(f'创建分类 {name} 时出错: {str(e)}'))
                        continue
        
        except Exception as e:
            self.stdout.write(self.style.ERROR(f'导入目录 {path} 时出错: {str(e)}'))
    
    def parse_directory_name(self, dirname):
        """解析目录名称，格式：01_基础设施"""
        try:
            # 移除序号前缀
            if '_' in dirname:
                name = dirname.split('_', 1)[1]
            else:
                name = dirname
            return name
        except:
            return None 